package structuralPattern.adapter;

/**
 * @Author: Alex Hu
 * Date: 2020/2/22 4:41 下午
 * Content: 对象适配器模式示例（发动机适配器）
 * 设计意图：通过组合方式将不同发动机接口适配为统一的目标接口
 * 使用场景：当需要将多个不兼容的发动机接口（如电能、光能）统一为客户端期望的接口时，对象适配器通过组合实现转换
 */

/**
 * 目标：发动机
 * 设计意图：定义统一的发动机接口
 * 使用场景：当需要统一管理不同类型的发动机时使用
 */
interface Motor {
    /**
     * 驱动方法
     * 设计意图：定义发动机的驱动方法
     * 使用场景：当需要启动发动机时调用
     */
    void drive();
}

/**
 * 适配者1：电能发动机
 * 设计意图：定义电能发动机的具体实现
 * 使用场景：当需要使用电能发动机时使用
 */
class ElectricMotor {
    /**
     * 电能驱动方法
     * 设计意图：实现电能发动机的驱动方法
     * 使用场景：当需要启动电能发动机时调用
     */
    public void electricDrive() {
        System.out.println("电能发动机驱动汽车！");
    }
}

/**
 * 适配者2：光能发动机
 * 设计意图：定义光能发动机的具体实现
 * 使用场景：当需要使用光能发动机时使用
 */
class OpticalMotor {
    /**
     * 光能驱动方法
     * 设计意图：实现光能发动机的驱动方法
     * 使用场景：当需要启动光能发动机时调用
     */
    public void opticalDrive() {
        System.out.println("光能发动机驱动汽车！");
    }
}

/**
 * 电能适配器
 * 设计意图：将电能发动机转换为统一的发动机接口
 * 使用场景：当需要将电能发动机转换为统一接口时使用
 */
class ElectricAdapter implements Motor {
    /**
     * 电能发动机对象
     * 设计意图：存储电能发动机对象
     * 使用场景：当需要通过电能发动机发送驱动请求时使用
     */
    private ElectricMotor emotor;

    /**
     * 构造函数
     * 设计意图：初始化电能发动机对象
     * 使用场景：当需要创建电能适配器时调用
     */
    public ElectricAdapter() {
        emotor = new ElectricMotor();
    }

    /**
     * 驱动方法
     * 设计意图：实现统一的驱动方法，调用电能发动机的驱动方法
     * 使用场景：当需要启动电能发动机时调用
     */
    public void drive() {
        emotor.electricDrive();
    }
}

/**
 * 光能适配器
 * 设计意图：将光能发动机转换为统一的发动机接口
 * 使用场景：当需要将光能发动机转换为统一接口时使用
 */
class OpticalAdapter implements Motor {
    /**
     * 光能发动机对象
     * 设计意图：存储光能发动机对象
     * 使用场景：当需要通过光能发动机发送驱动请求时使用
     */
    private OpticalMotor omotor;

    /**
     * 构造函数
     * 设计意图：初始化光能发动机对象
     * 使用场景：当需要创建光能适配器时调用
     */
    public OpticalAdapter() {
        omotor = new OpticalMotor();
    }

    /**
     * 驱动方法
     * 设计意图：实现统一的驱动方法，调用光能发动机的驱动方法
     * 使用场景：当需要启动光能发动机时调用
     */
    public void drive() {
        omotor.opticalDrive();
    }
}

/**
 * 客户端代码
 */
public class MotorAdapterTest {
    /**
     * 主方法：演示电动机适配器模式
     * 设计意图：通过适配器将不同类型的电动机转换为统一的接口
     * 使用场景：当需要测试或演示电动机适配器模式时调用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        System.out.println("适配器模式测试：");
        Motor motor = (Motor) ReadXML.getObject();
        motor.drive();
    }
}
